#include "mypcap.h"

#include <qDebug>

//pcap_if_t* allNetwork = nullptr;     // 网卡信息
int                 size = 0;            // 网卡数量
char                errbuf[SIZE];                   // 错误信息
pcap_t* sniff = nullptr;      // 嗅探
struct pcap_pkthdr* packHeader = nullptr;      // 数据包头
const u_char* packData = nullptr;      // 数据报
//const int           packSum = 10;            // 最多循环抓取数据包的次数

ether_parse* eth_protocal = nullptr;         // 以太网协议
ip_parse* ip_protocal = nullptr;         // ip 协议
udp_parse* udp_protocal = nullptr;         // udp 协议
tcp_parse* tcp_protocal = nullptr;         // tcp 协议

// 利用嗅探获取数据包  cnt 网络嗅探编号
bool setSniffing(int cnt, pcap_if_t *alldevs)
{
    if(cnt < 0) return false;
    //得到指定嗅探
    pcap_if_t* adapters = alldevs;
    for(int i = 0 ;i < cnt && adapters ;i++)
    {
        adapters = adapters->next;
    }
    if (adapters == nullptr) return false;

    qDebug()<< adapters->description ;
        // 当前抓包使用的嗅探为 pcap_if_t* curAdapter
    pcap_if_t* curAdapter = adapters;
#define  MAXDATAFRAMES 1518

    // 为捕获/发送数据打开一个普通的源
    // PCAP_OPENFLAG_PROMISCUOUS 网卡设置为混合模式
    // 1000 1000毫秒如果读不到数据就超时返回
    ::sniff = pcap_open(curAdapter->name, MAXDATAFRAMES, PCAP_OPENFLAG_PROMISCUOUS, 1000, NULL, ::errbuf);
    if (pcap_datalink(::sniff) != DLT_EN10MB) return false;      // 必须是以太网协议
    return ::sniff != nullptr;
}
// 获取数据包
bool getDataPacket(int packSum)
{
    return true;
}
// 解析数据链路层
bool ParseDateLine()
{
    return true;
}
// 解析网络层
bool ParseNetWork()
{
    return true;
}

// 解析传输层 0 随机解析  1 解析TCP  2 解析UDP  3 解析ICMP
bool ParseTransport()
{
    return true;
}

// 解析TCP协议
bool ParseTCP()
{
    return true;
}
// 解析UDP协议
bool ParseUDP()
{
    return true;
}

// 解析ICMP协议
bool ParseICMP()
{
    return true;
}
